package com.quyunshuo.module.home.activity.main


import android.content.Context
import android.graphics.Canvas
import android.text.TextUtils
import android.util.AttributeSet
import android.widget.Scroller
import androidx.appcompat.widget.AppCompatTextView

class ScrollTextView(context: Context, attrs: AttributeSet?) :
    AppCompatTextView(context, attrs) {

    // 使用Scroller实现平滑滚动效果
    private var scroller: Scroller = Scroller(context)

    // 标记是否需要滚动（文本超出控件宽度时）
    private var isScrollingRequired = false

    // 标记是否已经完成至少一次滚动（用于循环滚动逻辑）
    private var hasScrolledOnce = false

    init {
        // 确保单行显示（走马灯效果需要）
        maxLines = 1

        // 设置文本截断方式为走马灯（虽然不使用系统默认走马灯，但保留此设置）
        ellipsize = TextUtils.TruncateAt.MARQUEE
    }

    // 当视图尺寸变化时触发
    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        super.onSizeChanged(w, h, oldw, oldh)
        // 视图尺寸变化后重新计算是否需要滚动
        startScrolling()
    }

    // 自定义绘制逻辑
    override fun onDraw(canvas: Canvas) {
        // 如果不需要滚动，直接调用父类绘制方法
        if (!isScrollingRequired) {
            super.onDraw(canvas)
            return
        }

        // 滚动循环逻辑：
        // 1. 如果当前滚动已完成且已经滚动过一次（即不是首次滚动）
        // 2. 则重新开始反向滚动（回到起点）
        if (scroller.isFinished && hasScrolledOnce) {
            // 从当前位置滚动回起点（x坐标从当前位置回到0）
            scroller.startScroll(scroller.currX, 0, -scroller.currX, 0, 2000)
        } else {
            // 标记已经完成至少一次滚动
            hasScrolledOnce = true
        }

        // 计算当前滚动偏移量
        scroller.computeScrollOffset()
        val offset = scroller.currX

        // 通过平移画布实现文本滚动效果
        canvas.translate(-offset.toFloat(), 0f)  // 向左平移画布（负X方向）
        super.onDraw(canvas)                     // 绘制文本
        canvas.translate(offset.toFloat(), 0f)    // 恢复画布位置（避免影响后续绘制）

        // 如果滚动尚未完成，请求重绘以继续动画
        if (!scroller.isFinished) {
            invalidate()
        }
    }

    // 启动滚动逻辑
    private fun startScrolling() {
        // 测量文本实际宽度
        val textWidth = paint.measureText(text.toString())
        // 获取视图当前宽度
        val viewWidth = width

        // 只有当视图宽度有效且文本宽度大于视图宽度时才需要滚动
        if (viewWidth > 0 && textWidth > viewWidth) {
            isScrollingRequired = true
            hasScrolledOnce = false

            // 初始化滚动器：
            // 参数说明：startX, startY, dx, dy, duration
            // 从(0,0)开始，水平滚动距离为文本超出部分的宽度
            scroller.startScroll(0, 0, (textWidth - viewWidth).toInt(), 0, 5000)

            // 请求重绘以启动滚动动画
            invalidate()
        } else {
            // 如果不需要滚动，重置状态
            isScrollingRequired = false
        }
    }

    // 可选：添加暂停/恢复功能
    fun pauseScroll() {
        if (isScrollingRequired) {
            scroller.forceFinished(true)
        }
    }

    fun resumeScroll() {
        if (isScrollingRequired) {
            // 从当前位置继续滚动剩余距离
            val remaining = scroller.finalX - scroller.currX
            scroller.startScroll(scroller.currX, 0, remaining, 0, 5000)
            invalidate()
        }
    }

    // 视图从窗口分离时停止滚动
    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        scroller.forceFinished(true)
    }
}